/*! \file ModLogNeg.c
	\brief Modulo Vetor de Bits.

	As Responsabilidades do vetor de Bits consistem em
	Gericiar os espacos livros de um certo arquivo de registros atraves de
	um arquivo binario.
 */

#define LogNeg_Serv
#include "InLogNeg.h"

//lista de fun�oes do modulo
int TranformaAlbum_LN (Album_LN*, Album_PA*);
int TranformaFoto_LN (Foto_LN*, Foto_PF*);
int RetranformaAlbum_LN (Album_LN*, Album_PA*);
int RetranformaFoto_LN (Foto_LN*, Foto_PF*);

//fim

int TransformaAlbum_LN (Album_LN *AlbumPass, Album_PA *NovoAlbum)
{
	strcpy (NovoAlbum->CpfUser, AlbumPass->Cpf);
	strcpy (NovoAlbum->Codig, AlbumPass->Codig);
	strcpy (NovoAlbum->Nome, AlbumPass->Nome);
	strcpy (NovoAlbum->Descr, AlbumPass->Descr);
	NovoAlbum->NumerFotos = AlbumPass->NumerFotos;
	NovoAlbum->Priva = AlbumPass->Priva;

	return 0;
}

int TransformaFoto_LN (Foto_LN *FotoPass, Foto_PF *NovaFoto)
{
	strcpy (NovaFoto->CpfUser, FotoPass->Cpf);
	strcpy (NovaFoto->CodigAlbum, FotoPass->CodigAlbum);
	strcpy (NovaFoto->CodigFoto, FotoPass->CodigFoto);
	strcpy (NovaFoto->Nome, FotoPass->Nome);
	strcpy (NovaFoto->Data, FotoPass->Data);
	strcpy (NovaFoto->Iso, FotoPass->Iso);
	strcpy (NovaFoto->Abert, FotoPass->Abert);
	strcpy (NovaFoto->Veloc, FotoPass->Veloc);
	NovaFoto->Media = FotoPass->Media;
	NovaFoto->NumerVotos = FotoPass->NumerVotos;

	return 0;
}

int RetransformaAlbum_LN (Album_LN *AlbumPass, Album_PA *NovoAlbum)
{
	strcpy (AlbumPass->Cpf, NovoAlbum->CpfUser);
	strcpy (AlbumPass->Codig, NovoAlbum->Codig);
	strcpy (AlbumPass->Nome, NovoAlbum->Nome);
	strcpy (AlbumPass->Descr, NovoAlbum->Descr);
	AlbumPass->NumerFotos = NovoAlbum->NumerFotos;
	AlbumPass->Priva = NovoAlbum->Priva;

	return 0;
}

int RetransformaFoto_LN (Foto_LN *FotoPass, Foto_PF *NovaFoto)
{
	strcpy (FotoPass->Cpf, NovaFoto->CpfUser);
	strcpy (FotoPass->CodigAlbum, NovaFoto->CodigAlbum);
	strcpy (FotoPass->CodigFoto, NovaFoto->CodigFoto);
	strcpy (FotoPass->Nome, NovaFoto->Nome);
	strcpy (FotoPass->Data, NovaFoto->Data);
	strcpy (FotoPass->Iso, NovaFoto->Iso);
	strcpy (FotoPass->Abert, NovaFoto->Abert);
	strcpy (FotoPass->Veloc, NovaFoto->Veloc);
	FotoPass->Media = NovaFoto->Media;
	FotoPass->NumerVotos = NovaFoto->NumerVotos;

	return 0;
}

int AddConta_LN (const char* CpfPass, const char* NomePass, const char* SenhaPass)//terminar, 3 nomes,
{
	int CpfExist, VerifCriac, Resul;
	User_PU NovoUser;
	Album_LN NoClass;

	strcpy (NovoUser.Cpf, CpfPass);
	strcpy (NovoUser.Nome, NomePass);
	strcpy (NovoUser.Senha, SenhaPass);
	Resul = AddUsuario_PU (&NovoUser);
	if (Resul >= 0)
	{
		strcpy (NoClass.Cpf, CpfPass);
		strcpy (NoClass.Codig, "-111111111");
		strcpy (NoClass.Nome, "NULL-NULL-NULL-");
		strcpy (NoClass.Descr, "NULL-NULL-NULL-NULL-NULL-NULL-");
		NoClass.NumerFotos = 0;
		NoClass.Priva = 1;
		Resul = AddAlbum_LN (CpfPass, &NoClass);
	}
	return Resul;
}

int AddAlbum_LN (const char* CpfPass, Album_LN *AlbumPass)
{
	int NumerAlbunExist, Resul;
	Album_PA NovoAlbum;

	TransformaAlbum_LN (AlbumPass, &NovoAlbum);

	NumerAlbunExist = VerificaNumeroAlbuns_PU (CpfPass);
	if (NumerAlbunExist < 0)
	{
		return NumerAlbunExist * 100;
	}
	if (NumerAlbunExist == NUMEROALBUMSPORUSER + 1)
	{
		return -2;
	}

	Resul = AddAlbum_PA (&NovoAlbum);
	if (Resul < 0)
	{
		return Resul * 100;
	}

	Resul = AddAlbum_PU (CpfPass);
	if (Resul < 0)
	{
		Resul = AddAlbum_PU (CpfPass);
		if (Resul < 0)
		{
			DeletaAlbum_PA (CpfPass, NovoAlbum.Codig);
			return Resul * 100;
		}
	}

	return Resul;
}

int AddFoto_LN (const char* CpfPass, const char* CodigAlbumPass, Foto_LN *FotoPass)
{
	int NumerFotosExist, Resul;
	Foto_PF NovaFoto;

	TransformaFoto_LN (FotoPass, &NovaFoto);

	NumerFotosExist = NumeroFotosAlbum_PA (CpfPass, CodigAlbumPass);
	if (NumerFotosExist < 0)
	{
		return NumerFotosExist * 100;
	}
	if (NumerFotosExist == NUMEROFOTOSPORALBUM)
	{
		if (strcmp (CodigAlbumPass, "-111111111") == 0)
		{
			return -3;
		}

		return -2;
	}


	Resul = AddFoto_PF (CpfPass, CodigAlbumPass, NovaFoto);
	if (Resul == -2)
	{
		return -2;
	}
	if (Resul < 0)
	{
		return Resul;
	}

	Resul = AddFoto_PA (CpfPass, CodigAlbumPass);
	if (Resul < 0)
	{
		Resul = AddFoto_PA (CpfPass, CpfPass, CodigAlbumPass);
		if (Resul < 0)
		{
			DeletaFoto_PF (CpfPass, CodigAlbumPass, NovaFoto.CodigFoto);
			return Resul * 100;
		}
	}

	return Resul;
}

int EditaConta_LN (const char* CpfPass, const char* NomePass, const char* SenhaPass)
{
	int CpfExist, VerifCriac, Resul;
	User_PU NovoUser;

	strcpy (NovoUser.Cpf, CpfPass);
	strcpy (NovoUser.Nome, NomePass);
	strcpy (NovoUser.Senha, SenhaPass);

	Resul = AtualizaUser_PU (&NovoUser);
	return Resul;
}

int EditaAlbum_LN (Album_LN *AlbumPass)
{
	int Resul;
	Album_PA NovoAlbum;
	TransformaAlbum_LN (AlbumPass, &NovoAlbum);
	Resul = AtualizaAlbum_PA (&NovoAlbum);
	return Resul;
}

int EditaFoto_LN (Foto_LN *FotoPass)
{
	int Resul;
	Foto_PF NovaFoto;
	TransformaFoto_LN (FotoPass, &NovaFoto);
	Resul = AtualizaFoto_PF (&NovaFoto);
	return Resul;
}

int DeletaConta_LN (const char *CpfPass, User_LN *UserPass)
{
	int Resul;
	Album_LN *Atual = NULL, *Proxi = NULL;

	Atual = UserPass->ListaAlbum;

	while (Atual != NULL)
	{
		Proxi = Atual->Prox;
		DeletaAlbum_LN (Atual->Cpf, Atual->Codig, Atual);
		free (Atual);
		Atual = Proxi;
	}

	Resul = DeletaUser_PU (CpfPass);

	return Resul * 100;
}

int DeletaAlbum_LN (const char *CpfPass, const char *CodigAlbum, Album_LN *AlbumPass)
{
	int Resul;
	Foto_LN *Atual = NULL, *Proxi = NULL;

	Atual = AlbumPass->ListaFotos;

	while (Atual != NULL)
	{
		Proxi = Atual->Prox;
		DeletaFoto_LN (Atual->Cpf, Atual->CodigAlbum, Atual->CodigFoto);

		free (Atual);
		Atual = Proxi;
	}

	Resul = RemoveAlbum_PU (CpfPass);
	if (Resul < 0)
	{
		return Resul * 100;
	}
	Resul = DeletaAlbum_PA (CpfPass, CodigAlbum);

	return Resul * 100;
}

int DeletaFoto_LN (const char *CpfPass, const char *CodigAlbum, const char *CodigFoto)
{
	int Resul;

	Resul = RetiraFoto_PA (CpfPass, CodigAlbum);
	if (Resul < 0)
	{
		return Resul * 100;
	}
	Resul = DeletaFoto_PF (CpfPass, CodigAlbum, CodigFoto);

	return Resul * 100;
}

int FazLogin_LN (User_LN *UserPass)
{
	int Resul;
	User_PU NovoUser;

	Resul = VerificaSenha_PU (UserPass->Cpf, UserPass->Senha);
	if (Resul < 0)
	{
		return Resul;
	}

	if (Resul == 0)
	{
		Resul = PegaUser_PU (UserPass->Cpf, &NovoUser);
		strcpy (UserPass->Nome, NovoUser.Nome);
		UserPass->NumerAlbum = NovoUser.NumerAlbum;
		return Resul;
	}

	if (Resul >= NUMEROMAXTENTATIVAS)
	{
		BloqueiaUsuario_PU (UserPass->Cpf);
	}
    return -4;
}

int ListaAlbunsUsuario_LN (Album_LN **Publi, const char* CpfPass)
{
	Album_PA Eleme;
	Album_LN *Lista = NULL, *Auxil = NULL;
	int Posic = 0;

	Posic = ListaAlbuns_PA (&Eleme, Posic, CpfPass);

	while (Posic >= 0)
	{
		Auxil = Lista;
		Lista = (Album_LN*) malloc (sizeof (Album_LN));
		if (Lista == NULL)
		{
			return -2;
		}

		strcpy (Lista->Cpf, Eleme.CpfUser);
		strcpy (Lista->Codig, Eleme.Codig);
		Lista->Prox = Auxil;

		Posic = ListaAlbuns_PA (&Eleme, Posic, CpfPass);
	}
	*Publi = Lista;
	return 0;
}

int ListaFotosAlbum_LN (Foto_LN **Fotos, const char *CpfPass, const char *CodigPass)
{
	Foto_PF Eleme;
	Foto_LN *Lista = NULL, *Auxil = NULL;
	int Posic = 0;

	Posic = ListaFotos_PF (Eleme, Posic, CpfPass, CodigPass);
	while (Posic >= 0)
	{
		Auxil = Lista;
		Lista = (Foto_LN*) malloc (sizeof (Foto_LN));
		if (Lista == NULL)
		{
			return -20;
		}

		strcpy (Lista->Cpf, Eleme.CpfUser);
		strcpy (Lista->CodigAlbum, Eleme.CodigAlbum);
		Lista->Prox = Auxil;

		Posic = ListaPublicos_PA (Eleme, Posic);
	}
	*Fotos = Lista;
	return 0;
}

int ListaAlbunsPublicos_LN (Album_LN **Publi)
{
	Album_PA Eleme;
	Album_LN *Lista = NULL, *Auxil = NULL;
	int Posic = 0;

	Posic = ListaPublicos_PA (Eleme, Posic);
	while (Posic >= 0)
	{
		Auxil = Lista;
		Lista = (Album_LN*) malloc (sizeof (Album_LN));
		if (Lista == NULL)
		{
			return -20;
		}

		strcpy (Lista->Cpf, Eleme.CpfUser);
		strcpy (Lista->Codig, Eleme.Codig);
		Lista->Prox = Auxil;

		Posic = ListaPublicos_PA (Eleme, Posic);
	}
	*Publi = Lista;
	return 0;
}

int PegaUsuario_LN (User_LN *UserPass)
{
	User_PU NovoUser;
	int Resul;

	Resul = PegaUser_PU (UserPass->Cpf, &NovoUser);

	if (Resul < 0)
	{
		return Resul * 100;
	}

	strcpy (UserPass->Cpf, NovoUser.Cpf);
	strcpy (UserPass->Nome, NovoUser.Nome);
	strcpy (UserPass->Senha, NovoUser.Senha);

	return Resul;

}

int PegaFoto_LN (Foto_LN *FotoPass)
{
	Foto_PF NovaFoto;
	int Resul;

	Resul = PegaFoto_PF (FotoPass->Cpf, FotoPass->CodigAlbum, FotoPass->CodigFoto, &NovaFoto);

	if (Resul < 0)
	{
		return Resul * 100;
	}

	Resul = RetransformaFoto_LN (FotoPass, &NovaFoto);

	return Resul;

}

int PegaAlbum_LN (Album_LN *AlbumPass)
{
	Album_PA NovoAlbum;
	int Resul;

	Resul = PegaAlbum_PA (AlbumPass->Cpf, AlbumPass->Codig, &NovoAlbum);

	if (Resul < 0)
	{
		return Resul * 100;
	}

	Resul = RetransformaAlbum_LN (AlbumPass, &NovoAlbum);

	return Resul;

}

int VotaEmFoto_LN (Foto_LN* FotoPass, int ValorVoto)
{
	int Resul;
	FotoPass->Media = (((FotoPass->Media)*(FotoPass->NumerVotos) + ValorVoto) / (FotoPass->NumerVotos + 1));
	(FotoPass->NumerVotos)++;
	Resul = EditaFoto_LN (FotoPass);

	return Resul;
}

int MudaFotoAlbum_LN (Foto_LN* FotoPass, const char* CodigAlbum)
{
	int Resul, NumerFotos;
	Foto_PF NovaFoto;

	NumerFotos = NumeroFotosAlbum_PA (FotoPass->Cpf, CodigAlbum);

	if (NumerFotos < 0)
	{
		return NumerFotos * 100;
	}

	if (NumerFotos == NUMEROFOTOSPORALBUM)
	{
		return -1;
	}

	Resul = AddFoto_PA (FotoPass->Cpf, CodigAlbum);

	if (Resul < 0)
	{
		return Resul * 100;
	}

	Resul = RetiraFoto_PA (FotoPass->Cpf, FotoPass->CodigAlbum);

	if (Resul < 0)
	{
		return Resul * 100;
	}

	strcpy (FotoPass->CodigAlbum, CodigAlbum);

	Resul = TransformaFoto_LN (FotoPass, &NovaFoto);

	return Resul;
}

int ListaUsuariosBloqueados_LN (ListaUsers_LN **Bloqu)
{
	User_PU Eleme;
	ListaUsers_LN *Lista = NULL, *Auxil = NULL;
	int Posic = 0;

	Posic = ListaBloqueados_PU (&Eleme, Posic);

	while (Posic >= 0)
	{

		Auxil = Lista;
		Lista = (ListaUsers_LN*) malloc (sizeof (ListaUsers_LN));
		if (Lista == NULL)
		{
			return -20;
		}

		strcpy (Lista->Cpf, Eleme.Cpf);
		strcpy (Lista->Nome, Eleme.Nome);
		Lista->Prox = Auxil;

		Posic = ListaBloqueados_PU (&Eleme, Posic);
	}
	*Bloqu = Lista;
	return 0;
}

int DesbloqueiaUsuario_LN (const char* CpfPass)
{
	int Resul;

	Resul = LiberaUsuario_PU (CpfPass);

	return Resul;
}

int VerificaAdmin_LN (const char* NomePass, const char* SenhaPass)
{
	if (strcmp (NomePass, USUARIOMESTRE) == 0)
	{
		if (strcmp (SenhaPass, SENHAMESTRE) == 0)
		{
			return 0;
		}
	}

	return -1;
}

